package com.gsk.europepharma.salesReport.struts.actions;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import net.sf.json.JSONObject;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.hibernate.Query;
import org.hibernate.Session;

import com.gsk.europepharma.salesReport.hibernate.dao.tbSpBoSRCartoContourDAO;
import com.gsk.europepharma.salesReport.utils.Legende;
import com.gsk.europepharma.salesReport.utils.UtilsSalesReport;

public class BornesCarte1 extends Action {
	
	public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {
		
		// Variables de session
		HttpSession sessionObject = request.getSession();
		Integer cs_adm_pdt = (Integer) sessionObject.getAttribute("cs_adm_pdt");
		Integer cs_adm_rgpt = (Integer) sessionObject.getAttribute("cs_adm_rgpt");
		Integer cs_adm_prstn = (Integer) sessionObject.getAttribute("cs_adm_prstn");
		Integer cs_network = (Integer) sessionObject.getAttribute("cs_network");
		Integer cs_month = (Integer) sessionObject.getAttribute("cs_month");
		// Fin de session
		
		// Recuperation des parametres
		
		String calculPalettes = request.getParameter("calculPalettes");
		
		String source = request.getParameter("source");
		Integer CS_SRC = Integer.parseInt(source);
		String unite = request.getParameter("unite");
		String periode = request.getParameter("periode");
		String idGeog = request.getParameter("idGeog");
		Integer idGeogInteger = Integer.parseInt(idGeog);
		String nivGeog = request.getParameter("nivGeog");
		
		// Parametres : Activite et Carto
		String indicateur = request.getParameter("indicateur");
		String indicateur1 = request.getParameter("indicateur1");
		String indicateur2 = request.getParameter("indicateur2");
		
		// Recupération de la legende Region
		Legende legendeRegion = (Legende) sessionObject.getAttribute("legendeRegion");
		
		// Recupération de la legende Secteur 
		Legende legendeSecteur = (Legende) sessionObject.getAttribute("legendeSecteur");
		
		Double minLegende1 = 0.0;
		Double maxLegende1 = 0.0;
		Integer count1 = 0;
		
		// Requete 1 
		
		tbSpBoSRCartoContourDAO cartoContourDAO = new tbSpBoSRCartoContourDAO();
		Session session = cartoContourDAO.getSession();
		String strReq = "";
		 
		if (!indicateur.equals("")) { // HIERARCHIQUE 
			strReq = cartoContourDAO.QUERY_BORNES_CARTE1;
		} else { // ISOGEOG 
			if (nivGeog.equals("Zone") || nivGeog.equals("Region")) {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE1;
			} else {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE2_SECTEUR;
			}
		}
		Query req = session.createSQLQuery(session.getNamedQuery(strReq).getQueryString());
		
		if (!indicateur.equals("")) { // HIERARCHIQUE
			req.setString("indicateur", indicateur);
		} else { // ISOGEOG 
			req.setString("indicateur", indicateur1);
		}
		req.setString("data", unite + periode);	
		req.setInteger("cs_adm_pdt", cs_adm_pdt);
		req.setInteger("cs_adm_rgpt", cs_adm_rgpt);
		req.setInteger("cs_adm_prstn", cs_adm_prstn);
		req.setInteger("CS_SRC", CS_SRC);
		req.setInteger("cs_month", cs_month);
		req.setInteger("cs_network", cs_network);
		req.setString("nivGeog", nivGeog); 
		req.setInteger("idGeog", idGeogInteger);
		req.setMaxResults(10);
		
		ArrayList result = new ArrayList(req.list());
		Iterator iter = result.iterator();
		while (iter.hasNext()) {
			Object[] val = (Object[]) iter.next();
			minLegende1 = Double.parseDouble(val[0].toString());
			maxLegende1 = Double.parseDouble(val[1].toString());
			count1 = Integer.parseInt(val[2].toString());
		}
		
		// Requete 2 : si indicateur est PM, D_PM ou EVOL_VOL, on doit rechercher les min, max et count 
		Double minLegende2 = minLegende1;
		Double maxLegende2 = maxLegende1;
		Integer count2 = count1;
		if (indicateur.equals("PM") || indicateur.equals("D_PM") || indicateur.equals("EVOL_VOL")) { // HIERARCHIQUE 
			cartoContourDAO = new tbSpBoSRCartoContourDAO();
			session = cartoContourDAO.getSession();
			strReq = "";
			if (nivGeog.equals("Zone")) {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE2_REGION;
			} else {
				strReq = cartoContourDAO.QUERY_BORNES_CARTE2_SECTEUR;
			}
			req = session.createSQLQuery(session.getNamedQuery(strReq).getQueryString());
			req.setString("indicateur", indicateur);
			req.setString("data", unite + periode);	
			req.setInteger("cs_adm_pdt", cs_adm_pdt);
			req.setInteger("cs_adm_rgpt", cs_adm_rgpt);
			req.setInteger("cs_adm_prstn", cs_adm_prstn);
			req.setInteger("CS_SRC", CS_SRC);
			req.setInteger("cs_month", cs_month);
			req.setInteger("cs_network", cs_network);
			req.setInteger("idGeog", idGeogInteger);
			req.setString("nivGeog", nivGeog);
			req.setMaxResults(10);
			result = new ArrayList(req.list());
			iter = result.iterator();
			// Calcul du min, max et du nombre de valeurs pour la legende 
			while (iter.hasNext()) {
				Object[] val = (Object[]) iter.next();
				if (val[0] == null) {
					minLegende2 = minLegende1;
				} else {
					minLegende2 = Double.parseDouble(val[0].toString());
				}
				if (val[1] == null) {
					maxLegende2 = maxLegende1;
				} else {
					maxLegende2 = Double.parseDouble(val[1].toString());
				}
				count2 = Integer.parseInt(val[2].toString());
			}
		}
		
		// On prend les extremites des legendes des 2 cartes 
		Double minLegende = Math.min(minLegende1, minLegende2);
		Double maxLegende = Math.max(maxLegende1, maxLegende2);
		Integer count = Math.max(count1, count2);
		
		// Initialisation de la palette 
		if (calculPalettes.equals("true") || !legendeRegion.getTypeClassement().equals("DU") || !legendeSecteur.getTypeClassement().equals("DU") ) {
			double pas = (maxLegende - minLegende) / legendeRegion.getNbTranches();
			double tempPas = minLegende;
			for (int i = 0; i < legendeRegion.getNbTranches(); i++) {
				legendeRegion.getPalettes().get(i).setMin(UtilsSalesReport.arrondir(tempPas, 3));
				legendeRegion.getPalettes().get(i).setMax(UtilsSalesReport.arrondir(tempPas + pas, 3));
				tempPas += pas;
			}
		}
		
		// Mise en session
		legendeRegion.setMin(minLegende);
		legendeRegion.setMax(maxLegende);
		legendeRegion.setCount(count1);
		sessionObject.setAttribute("legendeRegion", legendeRegion);
		
		// Si l'indicateur est PM, D_PM ou EVOL_VOL, les min et max sont identiques dans les 2 legendes 
		if (indicateur.equals("PM") || indicateur.equals("D_PM") || indicateur.equals("EVOL_VOL")) {
			// Mise en session
			legendeSecteur.setMin(minLegende);
			legendeSecteur.setMax(maxLegende);
			//legendeSecteur.setCount(count2);
			sessionObject.setAttribute("legendeSecteur", legendeSecteur);
		}
		
		HashMap hm = new HashMap();
		hm.put("minLegende", minLegende);
		hm.put("maxLegende", maxLegende);
		hm.put("count", count);
		hm.put("legendeRegion", legendeRegion);

		JSONObject json = JSONObject.fromObject(hm);

		response.addHeader("Content-Type", "application/json");
        response.getOutputStream().write(json.toString().getBytes("UTF-8"));
        response.getOutputStream().flush();
		
		return null;
	}

}
